import pandas as pd
import os
from collections import defaultdict


def process_access_control_data(input_file, output_file):
    """
    处理门禁数据，根据门禁点拆分到不同工作表
    
    Args:
        input_file: 输入文件路径
        output_file: 输出文件路径
    """

    # 读取原始数据[2,3](@ref)
    try:
        if input_file.endswith('.xlsx'):
            df = pd.read_excel(input_file)
        else:
            df = pd.read_csv(input_file)
        print(f"成功读取数据，共{len(df)}行")
    except Exception as e:
        print(f"读取文件失败: {e}")
        return False

    # 检查必要的列是否存在[2](@ref)
    if '姓名' not in df.columns or '门禁点' not in df.columns:
        print("数据中必须包含'姓名'和'门禁点'列")
        return False

    # 用于存储每个门禁点的数据[3,8](@ref)
    access_point_data = defaultdict(list)

    # 遍历每一行数据[2](@ref)
    for index, row in df.iterrows():
        姓名 = row['姓名']
        门禁点 = str(row['门禁点']) if pd.notna(row['门禁点']) else ""

        # 跳过空的门禁点
        if not 门禁点.strip():
            continue

        # 分割门禁点（支持;分隔）[2](@ref)
        access_points = [ap.strip() for ap in 门禁点.split(';') if ap.strip()]

        # 为每个门禁点添加数据[3](@ref)
        for access_point in access_points:
            access_point_data[access_point].append(row.to_dict())

    # 创建Excel写入对象[3,5](@ref)
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        summary_data = []

        # 处理每个门禁点的数据[3](@ref)
        for access_point, data_list in access_point_data.items():
            # 转换为DataFrame
            ap_df = pd.DataFrame(data_list)

            # 姓名去重（保留第一次出现的记录）[3](@ref)
            ap_df = ap_df.drop_duplicates(subset=['姓名'], keep='first')

            # 清理工作表名称（Excel限制31字符且不能包含特殊字符）[3](@ref)
            sheet_name = clean_sheet_name(access_point)

            try:
                # 写入对应的工作表[5](@ref)
                ap_df.to_excel(writer, sheet_name=sheet_name, index=False)

                # 添加到汇总统计
                summary_data.append({
                    '门禁点名称': access_point,
                    '工作表名称': sheet_name,
                    '记录数': len(ap_df)
                })

                print(f"创建工作表 '{sheet_name}'，包含 {len(ap_df)} 条记录")

            except Exception as e:
                print(f"创建工作表 '{sheet_name}' 时出错: {e}")
                continue

        # 创建汇总工作表[5](@ref)
        if summary_data:
            summary_df = pd.DataFrame(summary_data)
            summary_df = summary_df.sort_values('记录数', ascending=False)

            # 添加总计行
            total_records = summary_df['记录数'].sum()
            total_sheets = len(summary_df)

            total_row = pd.DataFrame([{
                '门禁点名称': '总计',
                '工作表名称': f'共{total_sheets}个工作表',
                '记录数': total_records
            }])

            summary_df = pd.concat([summary_df, total_row], ignore_index=True)
            summary_df.to_excel(writer, sheet_name='统计汇总', index=False)

            print(f"\n创建统计汇总表，总记录数: {total_records}，总工作表数: {total_sheets}")

        # 保留原始数据（可选）
        try:
            df.to_excel(writer, sheet_name='原始数据', index=False)
        except:
            pass

    return True


def clean_sheet_name(name, max_length=31):
    """
    清理工作表名称，移除非法字符并限制长度[3](@ref)
    
    Args:
        name: 原始名称
        max_length: 最大长度（Excel限制为31字符）
    
    Returns:
        清理后的工作表名称
    """
    # 移除非法字符[3](@ref)
    illegal_chars = ['\\', '/', '*', '?', ':', '[', ']']
    for char in illegal_chars:
        name = name.replace(char, '')

    # 替换可能引起问题的字符
    name = name.replace('\n', ' ').replace('\r', ' ')

    # 去除首尾空格
    name = name.strip()

    # 如果名称为空，使用默认名称
    if not name:
        name = '未命名'

    # 限制长度[3](@ref)
    if len(name) > max_length:
        name = name[:max_length - 3] + '...'

    return name
"""
每一个姓名可能属于多个设备门禁，python实现遍历属性列：门禁点 ，假设门禁点属性列的该单元格具有多个设备门禁点，以;隔开，遍历每一行该列门组的单元格，如果没有该设备门禁点名称的工作表，就新建以该设备门门禁点为名称的唯一工作表。而且把每一个属于相关设备门禁点工作表的 姓名  的该行信息，都添加至对应工作表中，每个表姓名要去重复，创建统计汇总工作表统计所有工作表的行数（不包括首行）
"""

def main():
    """主函数"""
    # 配置输入输出路径
    input_file = "C:\\Users\\00\\Desktop\\每日动环\\按人授权权限列表.xlsx"  # 支持.xlsx或.csv
    output_file = "C:\\Users\\00\\Desktop\\每日动环\\门禁数据统计.xlsx"

    # 检查输入文件是否存在
    if not os.path.exists(input_file):
        print(f"输入文件 {input_file} 不存在")
        print("请创建示例数据文件进行测试")
        create_sample_data()
        return

    # 处理数据
    success = process_access_control_data(input_file, output_file)

    if success:
        print(f"\n处理完成！结果已保存到: {output_file}")

        # 显示结果统计
        try:
            result_df = pd.read_excel(output_file, sheet_name='统计汇总')
            print("\n统计结果:")
            print("=" * 50)
            for _, row in result_df.iterrows():
                print(f"{row['门禁点名称']:20} {row['记录数']:>10} 条记录")
        except:
            pass
    else:
        print("处理失败，请检查输入数据和错误信息")


def create_sample_data():
    """创建示例数据文件（用于测试）"""
    sample_data = {
        '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'],
        '门禁点': [
            '正门;侧门', '正门', '侧门;后门', '正门;侧门;后门', '后门', '正门;后门', '侧门',
            '正门;侧门;后门;应急门'
        ],
        '部门': ['技术部', '销售部', '技术部', '行政部', '财务部', '人事部', '运维部', '管理部'],
        '工号': ['001', '002', '003', '004', '005', '006', '007', '008'],
        '职务':
        ['工程师', '销售经理', '高级工程师', '行政主管', '财务专员', '人事专员', '运维工程师', '部门经理']
    }

    df = pd.DataFrame(sample_data)
    df.to_excel("门禁数据.xlsx", index=False)
    print("已创建示例数据文件: 门禁数据.xlsx")
    print("示例数据内容:")
    print(df)


if __name__ == "__main__":
    # 运行主程序
    main()
